home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 08 - 1992 / 08.03 Jul 92 / Matrix Parser / Eval < prev    next >
Encoding:
Text File  |  1992-12-24  |  2.7 KB  |  140 lines  |  [TEXT/PJMM]

  1. unit Eval;
  2.  
  3.  
  4. interface
  5.  
  6.  
  7.     uses
  8.  
  9.         Globals, LexicalAnalysis, Parser, SetValues, EvaluateNodes;
  10.  
  11.  
  12.     function eval (var line: str255): str255;
  13.  
  14.  
  15.  
  16. implementation
  17.  
  18.  
  19.     function eval;
  20.  
  21.  
  22.         label
  23.             998, 999;
  24.  
  25.         var
  26.             removeblanks: boolean;
  27.             i, j, k, nstart, ntot: longint;
  28.             mrows, ncols: longint;
  29.             save: array2;
  30.             nodetable: hdlarrayhdlnoderecord;
  31.             flag: hdlflagtype;
  32.             store: boolean;
  33.             sy, tokentype: hdlstringarray0;
  34.             pr: hdlintarray0;
  35.             t: hdlextendarray;
  36.  
  37.     begin
  38.  
  39.         sy := hdlstringarray0(NewHandle(SizeOf(stringarray0)));
  40.         tokentype := hdlstringarray0(NewHandle(SizeOf(stringarray0)));
  41.         pr := hdlintarray0(NewHandle(SizeOf(intarray0)));
  42.         t := hdlextendarray(NewHandle(SizeOf(extendarray)));
  43.  
  44.         error := '';
  45.  
  46.         removeblanks := true;
  47.         lexicalanalysis(line, removeblanks, ntot, sy, tokentype, pr, error);
  48.  
  49.         if (error <> '') and (length(error) > 1) then
  50.             begin
  51.                 line := 'error';
  52.                 eval := error;
  53.                 goto 999;
  54.             end;
  55.  
  56.         nstart := 1;
  57.         store := false;
  58.  
  59.         nodetable := hdlarrayhdlnoderecord(NewHandle(SizeOf(arrayhdlnoderecord)));
  60.         flag := hdlflagtype(NewHandle(SizeOf(flagtype)));
  61.  
  62.         if (sy^^[2]^^ = equals) then
  63.             nstart := 3;
  64.  
  65.         for i := nstart to ntot do
  66.             flag^^[i] := false;
  67.  
  68.         for i := nstart to ntot do
  69.             begin
  70.                 for k := 1 to numvariables do
  71.                     begin
  72.                         j := numvariables + 1 - k;
  73.                         if (sy^^[i]^^ = strvar^^[j]^^) and ((tokentype^^[i]^^ = 'variable')) then
  74.                             begin
  75.                                 flag^^[i] := true;
  76.                                 tokentype^^[i]^^ := 'matrix';
  77.                                 goto 998;
  78.                             end;
  79.                     end;
  80. 998:
  81.             end;
  82.  
  83.         save[1] := sy^^[1]^^;
  84.         save[2] := sy^^[2]^^;
  85.  
  86.         for i := nstart to ntot do
  87.             if ((tokentype^^[i]^^ = 'variable') or (tokentype^^[i]^^ = 'matrix')) and (flag^^[i] = false) then
  88.                 begin
  89.                     error := concat(sy^^[i]^^, '  has not been defined');
  90.                     line := 'error';
  91.                     eval := error;
  92.                     goto 999;
  93.                 end;
  94.  
  95.         parser(ntot, sy, tokentype, pr, nodetable, numnodes, error);
  96.  
  97.         if (error <> '') and (length(error) > 1) then
  98.             begin
  99.                 eval := error;
  100.                 line := 'error';
  101.                 goto 999;
  102.             end;
  103.  
  104.         setvalues(nodetable, numnodes, numvariables);
  105.  
  106.         evaluatenodes(nodetable, numnodes, mrows, ncols, t, store, save, error);
  107.  
  108.         if (error <> '') and (length(error) > 1) then
  109.             begin
  110.                 line := 'error';
  111.                 eval := error;
  112.                 goto 999;
  113.             end;
  114.  
  115.         if numnodes <= 0 then
  116.             begin
  117.                 line := '';
  118.                 eval := '';
  119.                 goto 999;
  120.             end;
  121.  
  122.         eval := stringof(t^^[numnodes]^^ : decplaceplus10 : decplace);
  123.  
  124.         if (mrows = 1) and (ncols = 1) then
  125.             line := 'real'
  126.         else
  127.             line := 'matrix';
  128.  
  129.         DisposHandle(handle(nodetable));
  130.         DisposHandle(handle(flag));
  131.         DisposHandle(handle(sy));
  132.         DisposHandle(handle(tokentype));
  133.         DisposHandle(handle(pr));
  134.         DisposHandle(handle(t));
  135.  
  136.  
  137. 999:
  138.     end;
  139.  
  140. end.